import request from "@/lib/request";
import type { AxiosRequestConfig } from "axios";

// 响应数据类型定义
export interface ApiResponse<T = any> {
  code: number;
  message: string;
  data: T;
  success: boolean;
}

// 用户注册参数类型
export interface RegisterParams {
  username: string;
  password: string;
  email: string;
}

// 用户登录参数类型
export interface LoginParams {
  usernameOrEmail: string;
  password: string;
}

// 用户信息类型
export interface UserInfo {
  id: number;
  username: string;
  email: string;
  nickname: string;
  avatar?: string;
  createTime: string;
  updateTime: string;
  // 根据实际返回数据可能需要添加更多字段
}

// 登录响应类型
export interface LoginResponse {
  token: string;
  userInfo: UserInfo;
  // 根据实际返回数据可能需要添加更多字段
}

/**
 * 用户服务类
 * 提供用户注册、登录等功能
 */
export class UserService {
  /**
   * 用户注册
   * @param params 注册参数
   * @returns Promise<ApiResponse<UserInfo>>
   */
  static async register(
    params: RegisterParams
  ): Promise<ApiResponse<UserInfo>> {
    const config: AxiosRequestConfig = {
      method: "POST",
      url: "/users/register",
      data: params,
      headers: {
        "Content-Type": "application/json",
      },
    };

    return request<ApiResponse<UserInfo>>(config);
  }

  /**
   * 用户登录
   * @param params 登录参数
   * @returns Promise<ApiResponse<LoginResponse>>
   */
  static async login(params: LoginParams): Promise<ApiResponse<LoginResponse>> {
    const config: AxiosRequestConfig = {
      method: "POST",
      url: "/users/login",
      data: params,
      headers: {
        "Content-Type": "application/json",
      },
    };

    return request<ApiResponse<LoginResponse>>(config);
  }

  /**
   * 保存登录令牌到本地存储，并设置2小时过期
   * @param token 登录令牌
   */
  static saveToken(token: string): void {
    const expiresAt = Date.now() + 2 * 60 * 60 * 1000; // 2小时后过期
    localStorage.setItem("auth_token", JSON.stringify({ token, expiresAt }));
  }

  /**
   * 从本地存储获取登录令牌，自动判断是否过期
   * @returns 登录令牌或null
   */
  static getToken(): string | null {
    const data = localStorage.getItem("auth_token");
    if (!data) return null;
    try {
      const { token, expiresAt } = JSON.parse(data);
      if (Date.now() > expiresAt) {
        this.clearToken();
        return null;
      }
      return token;
    } catch {
      this.clearToken();
      return null;
    }
  }

  /**
   * 清除登录令牌
   */
  static clearToken(): void {
    localStorage.removeItem("auth_token");
  }

  /**
   * 检查是否已登录（未过期）
   * @returns 是否已登录
   */
  static isLoggedIn(): boolean {
    return !!this.getToken();
  }

  /**
   * 保存用户信息到本地存储
   * @param userInfo 用户信息
   */
  static saveUserInfo(userInfo: UserInfo): void {
    localStorage.setItem("user_info", JSON.stringify(userInfo));
  }

  /**
   * 从本地存储获取用户信息
   * @returns 用户信息或null
   */
  static getUserInfo(): UserInfo | null {
    const userInfoStr = localStorage.getItem("user_info");
    if (userInfoStr) {
      try {
        return JSON.parse(userInfoStr);
      } catch (error) {
        console.error("解析用户信息失败:", error);
        return null;
      }
    }
    return null;
  }

  /**
   * 清除用户信息
   */
  static clearUserInfo(): void {
    localStorage.removeItem("user_info");
  }

  /**
   * 用户登出
   */
  static logout(): void {
    this.clearToken();
    this.clearUserInfo();
  }
}

// 类型已经在上面导出，这里不需要重复导出
